// 题目描述：
// 给你一个 非严格递增排列 的数组 nums ，请你 原地 删除重复出现的元素，使每个元素 只出现一次 ，返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。

// 考虑 nums 的唯一元素的数量为 k ，你需要做以下事情确保你的题解可以被通过：

// 更改数组 nums ，使 nums 的前 k 个元素包含唯一元素，并按照它们最初在 nums 中出现的顺序排列。nums 的其余元素与 nums 的大小不重要。
// 返回 k 。
// 判题标准:

// 系统会用下面的代码来测试你的题解:

// int[] nums = [...]; // 输入数组
// int[] expectedNums = [...]; // 长度正确的期望答案

// int k = removeDuplicates(nums); // 调用

// assert k == expectedNums.length;
// for (int i = 0; i < k; i++) {
//     assert nums[i] == expectedNums[i];
// }
// 如果所有断言都通过，那么您的题解将被 通过。

 

// 示例 1：

// 输入：nums = [1,1,2]
// 输出：2, nums = [1,2,_]
// 解释：函数应该返回新的长度 2 ，并且原数组 nums 的前两个元素被修改为 1, 2 。不需要考虑数组中超出新长度后面的元素。
// 示例 2：

// 输入：nums = [0,0,1,1,1,2,2,3,3,4]
// 输出：5, nums = [0,1,2,3,4]
// 解释：函数应该返回新的长度 5 ， 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4 。不需要考虑数组中超出新长度后面的元素。

// 自己的答案：
/**
 * @param {number[]} nums
 * @return {number}
 */
var removeDuplicates = function (nums) {
    let val;
    let i = nums.length
    while (i--) {
        if (nums[i] === val) {
            nums.splice(i, 1);
        } else {
            val = nums[i]
        }
    }
    // let val;
    // let iArr = []
    // let n = 0
    // nums.forEach((e, i) => {
    //     if (e === val) {
    //         iArr.push(i)
    //     } else {
    //         val = e
    //     }
    // })
    // iArr.forEach(e => { // 按索引删除对应内容
    //     nums.splice(e - n, 1)
    //     ++n
    // })
    return nums.length
};

// Gpt精简：
// 逆序
var removeDuplicates = function(nums) {  
    let i = nums.length;  
    while (i--) {  
        if (nums[i] === nums[i + 1]) nums.splice(i, 1);  
    }  
    return nums.length;  
};

// 顺序
var removeDuplicates = function(nums) {  
    if (nums.length === 0) return 0;  
  
    let index = 0; // 这个索引用来跟踪不重复元素应该存放的位置  
  
    for (let i = 1; i < nums.length; i++) {  
        // 如果当前元素不等于前一个元素（即不重复），则将其存放到index位置，并移动index  
        if (nums[i] !== nums[index]) {  
            index++;  
            nums[index] = nums[i];  
        }  
        // 如果当前元素等于前一个元素（即重复），则不执行任何操作，因为我们已经保留了前一个元素  
    }  
  
    // 数组的前index+1个元素都是不重复的，所以返回index+1作为新数组的长度  
    return index + 1;  
};

// 官方题解：
var removeDuplicates = function(nums) {
    const n = nums.length;
    if (n === 0) {
        return 0;
    }
    let fast = 1, slow = 1;
    while (fast < n) {
        if (nums[fast] !== nums[fast - 1]) {
            nums[slow] = nums[fast];
            ++slow;
        }
        ++fast;
    }
    return slow;
};